package thread.join;

public class ThreadThree extends Thread {


    private ThreadTwo two;
    public ThreadThree(ThreadTwo two){
        this.two = two;

    }
    @Override
    public void run() {
        System.out.println("线程三开始执行");
        synchronized (two){
            System.out.println("线程二已上锁");
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            try {
                two.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            /*
            * synchronized(two){...}；的意思是定义一个同步块,使用two作为资源锁。
            * two.wait();的意思是临时释放锁，并阻塞当前线程,好让其他使用同一把锁的线程有机会执行,
            * 在这里要用同一把锁的就是two线程本身.这个线程在执行到一定地方后用notify()通知wait的线程,锁已经用完,
            * 待notify()所在的同步块运行完之后,wait所在的线程就可以继续执行.*/
            System.out.println("线程二锁已释放");
        }

        System.out.println("线程三执行结束");
    }
}
